<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="xa1NV" id="xa1NV"><span data-lake-id="u665e3898" id="u665e3898">典型回答</span></h1>
  <p data-lake-id="u623452de" id="u623452de"><br></p>
  <p data-lake-id="ue134aa6f" id="ue134aa6f"><strong><span data-lake-id="u1b40fe1e" id="u1b40fe1e">Redis 使用自己设计的一种文本协议进行客户端与服务端之间的通信——RESP（REdis Serialization Protocol），</span></strong><span data-lake-id="u309bcd62" id="u309bcd62">这种协议简单、高效，易于解析，被广泛使用。</span></p>
  <p data-lake-id="u281366ce" id="u281366ce"><span data-lake-id="u5bb6cd8c" id="u5bb6cd8c">​</span><br></p>
  <p data-lake-id="ueb376e44" id="ueb376e44"><strong><span data-lake-id="u6e7a7965" id="u6e7a7965">RESP 协议基于 TCP 协议</span></strong><span data-lake-id="u737f72d7" id="u737f72d7">，采用请求/响应模式，每条请求由多个参数组成，以命令名称作为第一个参数。请求和响应都以行结束符（\r\n）作为分隔符，具体格式如下：</span></p>
  <p data-lake-id="u129fb999" id="u129fb999"><span data-lake-id="ud1116342" id="ud1116342">​</span><br></p>
  <pre lang="java"><code>
*&lt;number of arguments&gt;\r\n
$&lt;length of argument 1&gt;\r\n
&lt;argument data&gt;\r\n
...
$&lt;length of argument N&gt;\r\n
&lt;argument data&gt;\r\n
</code></pre>
  <p data-lake-id="u571739a8" id="u571739a8"><span data-lake-id="u7cd93a50" id="u7cd93a50" class="lake-fontsize-12" style="color: rgb(55, 65, 81); background-color: rgb(247, 247, 248)">​</span><br></p>
  <p data-lake-id="u71aae76c" id="u71aae76c"><span data-lake-id="uca4c62e0" id="uca4c62e0">其中，&lt;number of arguments&gt; 表示参数个数，&lt;length of argument&gt; 表示参数数据的长度，&lt;argument data&gt; 表示参数数据。参数可以是字符串、整数、数组等数据类型。</span></p>
  <p data-lake-id="ue2139806" id="ue2139806"><span data-lake-id="ua1beefce" id="ua1beefce">​</span><br></p>
  <p data-lake-id="u3a6b73d3" id="u3a6b73d3"><span data-lake-id="ueac294b8" id="ueac294b8">例如，以下是一个 Redis 协议的示例请求和响应：</span></p>
  <p data-lake-id="u49e97bf0" id="u49e97bf0"><span data-lake-id="ub936c48b" id="ub936c48b">请求：</span></p>
  <p data-lake-id="u8f3b839f" id="u8f3b839f"><span data-lake-id="ubcbf6445" id="ubcbf6445">​</span><br></p>
  <pre lang="java"><code>
*3\r\n
$3\r\n
SET\r\n
$5\r\n
mykey\r\n
$7\r\n
myvalue\r\n
</code></pre>
  <p data-lake-id="u116d69f9" id="u116d69f9"><span data-lake-id="u910f3b44" id="u910f3b44">​</span><br></p>
  <p data-lake-id="ufc9cd3f3" id="ufc9cd3f3"><span data-lake-id="ua7f9df43" id="ua7f9df43">响应：</span></p>
  <pre lang="java"><code>
+OK\r\n
</code></pre>
  <p data-lake-id="u9c6838fc" id="u9c6838fc"><span data-lake-id="u086a0695" id="u086a0695">​</span><br></p>
  <p data-lake-id="ue47a30b6" id="ue47a30b6"><span data-lake-id="u1afac2b0" id="u1afac2b0">上面的请求表示向 Redis 服务器设置一个名为 "mykey" 的键，值为 "myvalue"。响应返回 "+OK" 表示操作成功。</span></p>
  <p data-lake-id="u5f76064c" id="u5f76064c"><span data-lake-id="u0a0a6fa3" id="u0a0a6fa3">​</span><br></p>
  <blockquote data-lake-id="u0290ac07" id="u0290ac07">
   <p data-lake-id="ucab66e56" id="ucab66e56"><span data-lake-id="u03f9175e" id="u03f9175e">"$3\r\n"表示参数长度为3，即下一个参数是一个3个字符的字符串。它表示要执行的命令是"SET"，即设置键值对。</span></p>
   <p data-lake-id="ue63652da" id="ue63652da"><span data-lake-id="ufbd2080b" id="ufbd2080b">​</span><br></p>
   <p data-lake-id="u41bd7083" id="u41bd7083"><span data-lake-id="u5ac3efc4" id="u5ac3efc4">"$5\r\n"表示参数长度为5，即下一个参数是一个5个字符的字符串。它表示要设置的键是"mykey"。</span></p>
   <p data-lake-id="u6613d662" id="u6613d662"><span data-lake-id="u4ba56aca" id="u4ba56aca">​</span><br></p>
   <p data-lake-id="uc5405c24" id="uc5405c24"><span data-lake-id="u085e997a" id="u085e997a">"$7\r\n"表示参数长度为7，即下一个参数是一个7个字符的字符串。它表示要设置的值是"myvalue"。</span></p>
  </blockquote>
  <p data-lake-id="uf7c0a6f3" id="uf7c0a6f3"><span data-lake-id="uc264cf86" id="uc264cf86">​</span><br></p>
  <p data-lake-id="ud20b7623" id="ud20b7623"><span data-lake-id="u45e183ac" id="u45e183ac">除了基本的 GET、SET 操作，Redis 还支持事务、Lua 脚本、管道等高级功能，这些功能都是通过 Redis 协议来实现的。</span></p>
 </body>
</html>